E-파드 마운팅 recursiveReadOnly

개요

쿠버네티스 스토리지에는 재귀적 읽기 전용 마운팅에 대한 내용이 나온다.
그러나 처음에 헷갈렸던 게, 파드에서 서브 디렉토리를 볼륨으로 만들고 이걸 쓰기 가능하게 마운팅하면 문제가 생긴다는 것으로 이해를 했었다.
그러나 구체적으로 이것은 읽기 전용 마운팅을 했는데, 외부에서 해당 디렉토리의 서브로 마운팅을 한 상황을 이야기한다.
구체적으로 이게 무엇을 뜻하는지 알아보자.

실험 환경은 EKS 1.31버전이다.

세팅

image.png
먼저 노드에 이렇게 디렉토리가 잡혀있다고 해보자.

apiVersion: v1
kind: Pod
metadata:
  name: recursive
spec:
  containers:
  - name: recursive
    image: centos
    command: ["sh", "-c", "while true; do sleep 60; done"]
    volumeMounts:
    - name: first
      mountPath: /test/readonly
      readOnly: true
      # recursiveReadOnly: Enabled
  volumes:
    - name: first
      hostPath:
        path: /test/readonly
  terminationGracePeriodSeconds: 1

이 파드는 readonly라는 디렉토리를 읽기 모드로 마운팅하고 있다.
그렇기에 기본적으로 해당 디렉토리에 쓰기 작업을 할 수는 없다.
그러나 스토리지 공간 부족 등의 이유로 관리자가 노드를 관리하면서 submount 디렉토리에 다른 디렉토리를 마운팅하여 사용한다고 쳐보자.
image.png
간단한 테스트를 위해 바인딩을 했다.
그러나 실제 상황이라면 nfs나, tmpfs를 마운팅하는 등의 조작을 할 수 있을 것이다.
원래 파드 스펙의 의도대로라면, 파드는 submount 디렉토리에 쓰기 작업을 할 수 없어야만 한다.

결과..

image.png
그러나.. 파드는 당당하게 해당 디렉토리에 쓰기 작업을 할 수 있게 된다.
관리자의 실수로 인해 임의의 사고가 발생할 수 있게 된다는 것이다.

결론

가장 좋은 예방책은, 애초에 hostPath를 사용하지 못하게 하는 것이다.
이는 어드미션 컨트롤을 통해 validation failed를 띄우도록 하는 것이 가장 효과적일 것이다.

문서의 내용대로라면, recursiveReadOnly: Enabled를 통해 이런 문제를 방지할 수 있다.[1]
이 기능은 Kubernetes v1.31 - Elli에서부터 기본 true로 설정돼있어서 해당 필드를 넣어서 파드를 배포하면 파드가 잘 배치된다.
image.png
그러나 eks 1.31에서는 containerd의 버전이 2.0이 아니라, 해당 필드를 적용해도 아무런 소용이 없다..
일해라 aws

k get --raw /api/v1/nodes/노드/proxy/configz | jq '.kubeletconfig.featureGates'

image.png
또한 기본 활성화된다던 피처 게이트 역시 활성화되지 않은 것으로 보인다.
이건 아마 아직 해당 기능이 베타 상태이기에 이렇게 해둔 게 아닐까 싶기도 하다.
image.png
get으로 파드의 정보를 보더라도, 적용이 되지 않아 disabled된 것이 보인다.

번외 - 로컬 클러스터 테스트

내 로컬 클러스터는 1.32 버전이기 때문에 관련한 설정이 적용될 거라 생각한다.
image.png
같은 방식으로 세팅을 진행했는데, 이번에는 이렇게 에러가 나온다.
runtime에서 지원되지 않는다고 확실하게 말이 나오는 것이 보였다.
image.png
내 로컬 클러스터 버전도 낮은 버전이었다..
다만 해당 필드를 정확하게 인식하고 있다는 점에서 eks 클러스터와는 다른 모습이다.

관련 문서

이름 noteType created
StatefulSet knowledge 2024-12-26
PersistentVolume knowledge 2025-01-11
StorageClass knowledge 2025-01-12
AWS EBS CSI Driver knowledge 2025-02-18
kubestr knowledge 2025-02-19
AWS EFS CSI Driver knowledge 2025-02-20
볼륨 스냅샷 knowledge 2025-02-20
3주차 - 스토리지 project 2025-02-16
3W - EFS 드라이버, 인스턴스 스토어 활용 published 2025-02-22
E-NFS 볼륨, 스토리지 클래스 설정 topic/explain 2024-10-17
E-바인딩과 하드 링크의 차이 topic/explain 2025-01-16
E-emptyDir 제한 topic/explain 2025-01-16
E-파드 마운팅 recursiveReadOnly topic/explain 2025-02-27
E-projected 볼륨 - 동적 업데이트, 중복 활용 topic/explain 2025-03-10
T-vagrant 쿠버 버전 업그레이드 topic/temp 2025-01-14
T-볼륨 마운팅 위에 마운팅하기 topic/temp 2025-01-16
T-마운트 전파 Bidirectioal topic/temp 2025-02-28

참고


  1. https://kubernetes.io/docs/concepts/storage/volumes/#recursive-read-only-mounts ↩︎